/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package perl;

import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.UnsupportedEncodingException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.filechooser.FileFilter;
import java.io.File;
import java.net.URL;
import java.net.URLDecoder;
import javax.swing.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;

/**
 * Cette classe est une classe abstraire qui définit des fonctions communes
 * utilisant dans les fenêtres ou les dialogues box.
 * @author NGUYEN Dac Cong Tai
 */
public abstract class Utility {

    /**
     * Ouvre le dialogue box pour choisir un fichier.
     * @param url le chemin du dossier en ouverture
     * @param frame la fenêtre
     * @return un JFileChooser
     */
    public static JFileChooser ouvrirOpenBox(String url, JFrame frame){
        JFileChooser chooser;
        if (url!=null){
            chooser = new JFileChooser(url);
        } else {
            chooser = new JFileChooser();
        }
        chooser.setAcceptAllFileFilterUsed(false);
        chooser.addChoosableFileFilter(new FileFilter() {
            public boolean accept(File pathname) {
                if (pathname.isDirectory()) {
                    return true;
                }
                String extension = getExtension(pathname);
                if (extension != null) {
                    if (extension.equals("xml") ) {
                            return true;
                    } else {
                        return false;
                    }
                }
                return false;
            }

            @Override
            public String getDescription() {
                return "Profil Eprofilea (.xml)";
            }
        });
        
        int returnVal = chooser.showOpenDialog(frame);
        if(returnVal == JFileChooser.APPROVE_OPTION){
            return chooser;
        } else {
            return null;
        }
    }

    /**
     * Récupère l'extention d'un fichier.
     * @param f le fichier
     * @return l'extension du fichier
     */
    public static String getExtension(File f) {
        String ext = null;
        String s = f.getName();
        int i = s.lastIndexOf('.');

        if (i > 0 &&  i < s.length() - 1) {
            ext = s.substring(i+1).toLowerCase();
        }
        return ext;
    }

    /**
     * Crée un menu item et l'ajoute dans un menu.
     * @param frame l'ActionListener
     * @param m le menu
     * @param label le nom du menu item
     * @param command le nom d'action du menu item
     * @param key
     */
    public static void addMenuItem(ActionListener frame, JMenu m, String label, String command, int key, boolean enable) {
        JMenuItem menuItem;
	menuItem = new JMenuItem(label);
        menuItem.setEnabled(enable);
        menuItem.setName(label);
        m.add(menuItem);

        menuItem.setActionCommand(command);
        menuItem.addActionListener(frame);
	if (key > 0) {
            if (key != KeyEvent.VK_DELETE)
		menuItem.setAccelerator(KeyStroke.getKeyStroke(key, Event.CTRL_MASK, false));
            else
		menuItem.setAccelerator(KeyStroke.getKeyStroke(key, 0, false));
	}
    }

    /**
     * Quitte l'application.
     */
    public static void exit(){
        System.exit(0);
    }

    /**
     * Convertit un fichier XML en un élément.
     * @param url le chemin du fichier
     * @return l'Elément
     */
    public static Element getElement(String url){
        try {
            DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            Document doc = db.parse(url);
            return doc.getDocumentElement();
        } catch (Exception e){
            JOptionPane.showMessageDialog(new JPanel(),
                    e.getMessage(),
                    "Error",
                    JOptionPane.ERROR_MESSAGE);
            exit();
            return null;
        }
    }

    /**
     * Renvoie le chemin d'un dossier ou un fichier spécifié
     * @param o l'Objet
     * @param cheminDestinataire le dossier ou le fichier spécifié
     * @return le chemin du dossier spécifié
     */
    public static String getPath(Object o, String cheminDestinataire){
        try {
            String nomProjet = "Eprofilea_TER_2009";
            String path = "/" + PerlApp.class.getName().replace('.', '/') + ".class";
            URL url = o.getClass().getResource(path);
            path = URLDecoder.decode(url.toString(), "UTF-8");
            // suppression de  la classe ou du jar du path de l'url
            int index = path.lastIndexOf("/");
            path = path.substring(0, index);
            if (path.startsWith("jar:file:")) {
                // suppression de jar:file: de l'url d'un jar
                // ainsi que du path de la classe dans le jar
                index = path.indexOf("!");
                path = path.substring(9, index);
            } else {
                // suppresion du file: de l'url si c'est une classe en dehors d'un jar
                // et suppression du path du package si il est présent.
                path = path.substring(5, path.length());
                Package pack = o.getClass().getPackage();
                if (null != pack) {
                    String packPath = pack.toString().replace('.', '/');
                    if (path.endsWith(packPath)) {
                        path = path.substring(0, path.length() - packPath.length());
                    }
                }
            }
            path = path.substring(0, path.indexOf(nomProjet) + nomProjet.length());
            if (cheminDestinataire != null) {
                path += cheminDestinataire;
            }
            return path;
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(Utility.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(new JPanel(),
                    ex.getMessage(),
                    "Error",
                    JOptionPane.ERROR_MESSAGE);
            exit();
            return null;
        }
    }

    /**
     * Récupère le code du langage d'affichage.
     * @param langue le langage d'affichage
     * @return le code du langage d'affichage
     */
    public static String decodeLangue(String langue){
        if(langue.equals("Anglais") || langue.equals("anglais") || langue.equals("ANGLAIS")){
            return "en";
        } else {
            return "fr";
        }
    }
}
